← 返回列表

Web 安全 CSRF 原理与实践

1. 什么是CSRF

CSRF (Cross Site Request Forgery,跨站请求伪造) 是一种常见的Web攻击方式。攻击者会利用用户在已认证的Web应用程序的已登陆状态,诱导用户在另一个页面上触发恶意请求,而这些请求会被服务器误认为是用户本人发起的合法行为。

为了防止此类攻击,Web应用通常需要在身份认证之外,加入额外的请求合法性检验,最常见见的合法性校验方式为CSRF Token。

2. 如何防范 CSRF 攻击:CSRF Token

其工作流程可以概括为以下四步:

  1. 服务端生成唯一token。该token用于标识当前用户会话,在前后端交互时由后端通过响应头或响应体向前端传递。
  2. 客户端使用token与后端交互。客户端获取到token后,在向后端发送请求时需要携带该token,例如将Token放入请求头,以表明该请求确实来自可信页面。
  3. 服务端校验token。服务端在接收请求后,先对token进行验证。如果Token缺失、不匹配或已过期,则会拒绝请求。
  4. 服务端重新生成token,避免token重用(可选)。服务端在响应包含token的合法请求时,应返回一个新的token,从而避免token重放攻击。

该方法相当于在认证用户信息的基础上,利用csrf-token标记合理的用户请求。由于csrf-token获取条件苛刻,并且不会重复使用,极大提高了csrf攻击的难度,可以有效防范csrf攻击。

3. 前端实践:如何管理CSRF Token

为了使Token使用更加自动化,通常会在前端封装统一的拦截器逻辑:

  1. 在响应拦截器中拦截最新Token。
  • 从响应头中提取x-csrf-token
  • 根据服务或域名进行缓存。
  • 供下一次请求使用。
  1. 在请求拦截器中自动携带Token
  • 在发送请求前读取目标服务对应的CSRF Token信息
  • 为目标服务添加 x-csrf-token 请求头
  1. CSRF Token失效时自动重试
  • 当服务端返回 CSRF Token invalid 错误时,触发刷新 Token 的请求,并使用新的 Token 重试原请求。
  • 用户不会感知重试流程。

通过拦截器将逻辑集中管理,可以避免在业务代码中散落重复逻辑,使 Token 使用更加安全、稳定、统一。